Use case: Octal PSRAM in memory-mapped mode (read and write operations)

Configuring an Octal PSRAM memory in memory-mapped mode and performing read/write operations.

Sequence diagram

Octal PSRAM in memory-mapped mode (read and write operations)

  @startuml
  == Initialization ==
  "Application" -> "OSPI" : HAL_OSPI_Init()
  "OSPI" --> "Application" : HAL_OK or HAL_INVALID_PARAM
  "Application" -> "System" : OSPI HW Initialization
  note right: Initialize GPIO
  "System" --> "Application" :

  == Configuration ==
  "Application" -> "OSPI" : HAL_OSPI_Command()
  note right: Program the OCTAL PSRAM to read/write
  "OSPI" --> "Application" : HAL_OK or HAL_ERROR

  "Application" -> "OSPI" : HAL_OSPI_MemoryMapped()
  "OSPI" --> "Application" :

  == Process ==
  "Application" -> "System" : Read/Write
  note right: Read/Write from internal memory
  "System" --> "Application" :
  @enduml

Code snippet

HAL1

HAL2

OSPI_HandleTypeDef OSPI;

 ospi.Instance = OSPI;
 ospi.Init.FifoThresholdByte = 4;
 ospi.Init.MemoryMode = HAL_OSPI_SINGLE_MEM;
 ospi.Init.MemoryType = HAL_OSPI_MEMTYPE_APMEM_16BITS;
 ospi.Init.MemorySize = HAL_OSPI_SIZE_256MB;
 ospi.Init.ChipSelectHighTimeCycle = 0x1U;
 ospi.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;
 ospi.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;
 ospi.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;
 ospi.Init.ClockPrescaler = 0;
 ospi.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFT_NONE;
 ospi.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;
 ospi.Init.ChipSelectBoundary = HAL_OSPI_BONDARYOF_8KB;
 ospi.Init.MaxTran = 0;
 ospi.Init.Refresh = 0;
 ospi.Init.MemorySelect = HAL_OSPI_CSSEL_NCS1;
 HAL_OSPI_Init(&ospi);

 OSPI_RegularCmdTypeDef scommand = {0};
 scommand.OperationType      = HAL_OSPI_OPTYPE_COMMON_CFG;
 scommand.InstructionMode    = HAL_OSPI_INSTRUCTION_8_LINES;
 scommand.InstructionWidth   = HAL_OSPI_INSTRUCTION_8_BITS;
 scommand.InstructionDTRMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
 scommand.Instruction        = 0xFFFFFFFF;
 scommand.AddressMode        = HAL_OSPI_ADDRESS_8_LINES;
 scommand.AddressWidth       = HAL_OSPI_ADDRESS_16_BITS;
 scommand.AddressDTRMode     = HAL_OSPI_ADDRESS_DTR_ENABLE;
 scommand.Address            = Address;
 scommand.AlternateBytesMode = HAL_OSPI_ALT_BYTES_NONE;
 scommand.DataMode           = HAL_OSPI_DATA_8_LINES;
 scommand.DataDTRMode        = HAL_OSPI_DATA_DTR_ENABLE;
 scommand.DataLength         = 2;
 scommand.DummyCycles        = 0;
 scommand.DQSMode            = HAL_OSPI_DQS_DISABLE;





 HAL_OSPI_Command(&ospi, &scommand, OSPI_TIMEOUT);

 OSPI_MemoryMappedTypeDef sMemMappedCfg;
 sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_ENABLE;
 sMemMappedCfg.TimeoutPeriodClock = 0x34;
 HAL_OSPI_MemoryMapped(&ospi, &sMemMappedCfg);
HAL_XSPI_Init(&xspi, HAL_OCTOSPI1);


/* Main peripheral configuration */
memory_config.mode = HAL_XSPI_MEMORY_SINGLE;
memory_config.type = HAL_XSPI_MEMORY_TYPE_APMEM_16BIT;
memory_config.size_bit = HAL_XSPI_MEMORY_SIZE_256MBIT;
memory_config.wrap_size_byte = HAL_XSPI_WRAP_NOT_SUPPORTED;
memory_config.clock_polarity = HAL_XSPI_CLOCK_LOW;
memory_config.cs_boundary = HAL_XSPI_CS_BOUNDARY_NONE;

timing_config.clk_prescaler = 0x1U;
timing_config.shift = HAL_XSPI_SAMPLE_SHIFT_NONE;
timing_config.hold = HAL_XSPI_DELAY_HOLD_NONE;
timing_config.cs_high_time_cycle = 0x1U;
timing_config.cs_release_time_cycle = 0x0U;
timing_config.cs_refresh_time_cycle = 0x0U;
timing_config.dlyb_state = HAL_XSPI_DLYB_ON;

xspi_config.memory = memory_config;
xspi_config.timing = timing_config;
if (HAL_XSPI_SetConfig(&hOCTOSPI1, &xspi_config) != HAL_OK)
{
  return NULL;
}

command.operation_type = HAL_XSPI_OPERATION_COMMON_CFG;
command.io_select = HAL_XSPI_IO_7_0;
command.instruction = WRITE_REG_CMD;
command.instruction_mode = HAL_XSPI_INSTRUCTION_8LINES;
command.instruction_width = HAL_XSPI_INSTRUCTION_8BIT;
command.instruction_dtr_mode_status = HAL_XSPI_INSTRUCTION_DTR_DISABLED;
command.addr = 0xFFFFFFFF;
command.addr_mode = HAL_XSPI_ADDR_8LINES;
command.addr_width = HAL_XSPI_ADDR_8BIT;
command.addr_dtr_mode_status = HAL_XSPI_ADDR_DTR_ENABLED;
command.alternate_bytes_mode = HAL_XSPI_ALTERNATE_BYTES_NONE;
command.data_mode = HAL_XSPI_REGULAR_DATA_8LINES;
command.data_dtr_mode_status = HAL_XSPI_DATA_DTR_ENABLED;
command.size_byte = 2;
command.dummy_cycle = 0;
command.dqs_mode_status = HAL_XSPI_DQS_DISABLED;
HAL_XSPI_SendRegularCmd(&xspi, &command, XSPI_TIMEOUT);

hal_xspi_memory_mapped_config_t mem_mapped_cfg;
mem_mapped_cfg.timeout_activation = HAL_XSPI_TIMEOUT_ENABLE;
mem_mapped_cfg.timeout_period_cycle = 0x34;
HAL_XSPI_StartMemoryMappedMode(&xspi, &mem_mapped_cfg);
HAL_XSPI_StopMemoryMappedMode(&xspi);

Key changes

  1. In HAL2, OSPI APIs are replaced by XSPI APIs (for example, HAL_OSPI_Init() becomes HAL_XSPI_Init()).

  2. In HAL2, configuration is applied using HAL_XSPI_SetConfig() after initialization.

  3. In HAL2, memory-mapped mode is started and stopped using HAL_XSPI_StartMemoryMappedMode() and HAL_XSPI_StopMemoryMappedMode().